/*
*
* 版权所有 Copyleft(c) 2005
* 刘炯个人工作室 Sharp-Mark Personal Studio
*
* 允许自由使用，复制，修改，传播和贩卖此源程序及其文档，而不必支付任何费用。
* 以上的版权信息必须出现在每一份复制品中。同时这份版权信息和许可声明
* 也必须出现在支持文档中。刘炯个人工作室不对此软件适于那种具体
* 用途做出任何阐述。此代码只作为代码本身提供对其品质不做任何保证。
*
*/

#include "../SharpmarkGraphicsLib/Utilities/matrix.h"
float const PI = 3.1415926;

class CRectForRotate
{
public:

	CRectForRotate(int width = 200, int t = 25) : _width(width), _t(t)
	{
		_angel = PI / _t / 2;

		// 注意，第四维是1，不是0。如果是0则无法平移...
		_target[0] = _source[0] = CVec4<float>(width, width * tan(_angel), 0, 1);
		_target[1] = _source[1] = CVec4<float>(-width, width * tan(_angel), 0, 1);
		_target[2] = _source[2] = CVec4<float>(-width, -width * tan(_angel), 0, 1);
		_target[3] = _source[3] = CVec4<float>(width, -width * tan(_angel), 0, 1);

	}

	~CRectForRotate()
	{
	}

	void DrawPattern(CPaintDC& dc)
	{
		do
		{
			// 原始坐标旋转
			for (int j = 0; j < 4; j++)
			{
				_source[j].ZRotate(PI / (float)_t);
				_target[j] = _source[j];
			}

			for (int k = 0; k < _t; k++)
			{
				const int move = _width / 2 + 30;		// 平移距离
				// 生成的矩型的坐标旋转，平移
				for (int j = 0; j < 4; j++)
				{
					_target[j].ZRotate(PI / (float)_t);
					_target[j].Translate(move, move, 0);
				}

				// 设置颜色
				CPen pen(0, 2, RGB(k * 10 % 255, abs(255 - k * 10) % 255, 100));
				dc.SelectObject(&pen);

				// 绘制飞轮
				dc.MoveTo(_target[3].x(), _target[3].y());
				for(int i = 0; i < 4; i++)
				{
					dc.LineTo(_target[i].x(), _target[i].y());

					_target[i].Translate(-move, -move, 0);		// 平移回来
				}

			}
			Sleep(100);
		}while(true);

	}

protected:
	CVec4<float> _source[4];			// 第一个矩形的位置
	CVec4<float> _target[4];			// 由第一个矩形生成的矩型的位置

	int _t;								// 矩形个数
	float _angel;						// 每个矩形的旋转角度
	int _width;							// 矩形长度
};

